package com.softeem.musicserver.controller;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.softeem.musicserver.dto.R;
import com.softeem.musicserver.entity.Admin;
import com.softeem.musicserver.service.AdminService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Objects;

@CrossOrigin  //开启不同源的访问，允许来自任何源的访问
@Tag(name = "管理员接口", description = "管理员相关功能接口，包含：登录，添加，修改，删除，查询等")
@RestController
public class AdminController {

    @Autowired
    private AdminService adminService;

    @Operation(summary = "管理员登录", description = "需提供管理员账号以及密码")   //对接口方法描述
    @Parameters({           //对接口方法参数描述
            @Parameter(name = "username", description = "管理员账号"),
            @Parameter(name = "password", description = "管理员密码")
    })
    @GetMapping("/admin/login")
    public R login(String username, String password) {
        Admin admin = new Admin();
        admin.setUsername(username);
        admin.setPassword(password);
        return adminService.login(admin);
    }

    @Operation(summary = "管理员添加", description = "需提供管理员账号以及密码")
    @PostMapping("/admin/reg")
    public R reg(@RequestBody Admin admin) {
        return adminService.add(admin);
    }

        @Operation(summary = "管理员更新", description = "根据管理员id修改密码或状态")
        @PutMapping("/admin/update")
        public R modify(@Parameter(description = "管理员对象，必须提供id,其他属性可选") @RequestBody Admin admin) {
            if (Objects.nonNull(admin.getPassword())) {
                //生成一个随机盐
                String salt = RandomUtil.randomString(6);
                //将随机盐和用户输入的密码组合加密
                String pwd = SecureUtil.md5(admin.getPassword() + salt);
                //将盐和加密后的密码添加到对象中
                admin.setSalt(salt);
                admin.setPassword(pwd);
            }
            //根据id修改管理员信息（务必传入管理员id）
            boolean b = adminService.updateById(admin);
            return b ? R.ok().setMsg("修改成功").setData(admin) : R.fail().setMsg("修改失败");
        }

        //http://127.0.0.1:8080/admin/del/10
        @Operation(summary = "管理员删除", description = "根据管理员id删除记录，该操作为物理删除，请谨慎处理")
        @DeleteMapping("/admin/del/{id}")
        public R delById(@Parameter(description = "管理员id") @PathVariable("id") Integer id) {
        Admin admin = adminService.getById(id);
        if (Objects.isNull(admin)) {
            return R.fail().setMsg("该管理员不存在");
        }
        return adminService.removeById(id) ? R.ok().setMsg("删除成功").setData(admin) : R.fail().setMsg("删除失败");
    }

    /**
     * 分页查询
     * @param page
     * @param limit
     * @return
     */
    @Operation(summary = "管理员列表",description = "显示所有管理员信息，含分页功能，需要提供当前页码(page)以及每页限制条数(limit)")
    @Parameters({
            @Parameter(name = "page",description = "当前页码数",required = true),
            @Parameter(name = "limit",description = "每页数据行数",required = true)
    })
    @GetMapping("/admin/list")
    public R list(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "5") Integer limit){
        //执行分页查询
        List<Admin> list = adminService.list(new Page<Admin>(page, limit));
        //查询中记录数
        long count = adminService.count();
        return R.ok().setData(list).setCount(count);
    }
}